module MemoriaRamRom(Clk, MemRst, MemAddress, WriteData, MemWrite, MemRead, MemData);

input [31:0] MemAddress, WriteData;
input MemRead, MemWrite, MemRst,Clk;

output wire [31:0] MemData;
reg [31:0] ArrMemory [0:63];

always @ (posedge Clk) begin
 if (MemRst) 
     begin 
      /*INSTRUCCIONES EN MEMORIA*/
       //ArrMemory[0] <=  32'h 8F_E1_00_00;    //1000_11-00_000-0_0001_0000_0000_0000_0000
       ArrMemory[0] <=  32'h 1F_E1_00_00;		//carga el valor de reg 31 en el reg 1 con addi 
       ArrMemory[1] <=  32'h 13_E1_00_02;    	//es el valor igual del registro 1 al 31? si: ve al 4 no: continua en el 3 osea ya cambio , si es igual me la pelo
       ArrMemory[2] <=  32'h 1F_E2_00_00;       //carga el valor de reg 31 en el reg 2 con addi               
       ArrMemory[3] <=  32'h 08_00_00_05;    	// ya no regreses vete a capturar mas numeros
       ArrMemory[4] <=  32'h 08_00_00_01;    	//regresa a y compara el reg 1 con el reg 31
       
       /*ArrMemory[0] <=  32'h 1C_01_00_08;
       ArrMemory[1] <=  32'h 8C_01_00_0D;    //Load LW 100011ss sssttttt i1000iii iiiiiiii 10001100 00000001 00000
       ArrMemory[2] <=  32'h 8C_02_00_0E;    // Load LW                  
       ArrMemory[3] <=  32'h 00_41_18_20;    //Add
       /*ArrMemory[4] <=  32'h 00_41_F1_19;    ///multi
       ArrMemory[4] <=  32'h AC_23_00_15;    //Store SW 
       ArrMemory[5] <=  32'h 00_41_20_22;    //SUB 
       ArrMemory[6] <=  32'h 00_41_28_24;    //and 000000 00_010 00001 _00101000_00000000;
       ArrMemory[7] <=  32'h 00_41_30_26;    //xor 000000 00_010 00001 _00110000_00000000;
       ArrMemory[8] <=  32'h 00_02_40_EE;    //shift 000000xx xxxttttt dddddccc 1c101110
       ArrMemory[9] <=  32'h 00_02_38_67;    //shift 000000xx xxxttttt dddddccc c1101110
       ArrMemory[10] <=  32'h 1C_33_00_08;    //ADDI           000111ss sssttttt dddddiii iiiiiiii 
       ArrMemory[11] <= 32'h 08_00_00_1C;    //jump           00001000 00000000 00000000 00000000
       ArrMemory[12] <= 32'h 10_A1_00_02;    //beq            000100ss sssttttt iiiiiiii iiiiiiii Magnitud del salto a partir de la instrucci�n actual,
//                                                                                                representado en complemento a 2*/
       /*DATOS EN MEMORIA */                                       //  10100001
       ArrMemory[13] <= 32'h 04; //DATO EN 0A LO ESCRIBE EN EL REG 1
       ArrMemory[14] <= 32'h 05;
       ArrMemory[15] <= 32'h 03; //sw
       ArrMemory[16] <= 32'h 01;
       ArrMemory[17] <= 32'h 15;

       ArrMemory[28] <= 32'h 10_A1_00_02;
       ArrMemory[31] <= 32'h 78;
       
     end
    else
        if(MemWrite && (MemAddress > 8'h11))
          begin
                ArrMemory[MemAddress] <= WriteData;
          end

end

assign MemData = (MemRead) ? ArrMemory[MemAddress] : 0; 	 
endmodule
